﻿using System;
using System.Security.Cryptography.X509Certificates;

namespace Lesson6_练习题
{
    //自定义一个整形数组类，该类中有一个整形数组变量，为它封装增删查改的方法
    class IntArray
    {
        private int[] arr;
        //capacity 和 length用于优化数组扩容算法
        private int capacity;
        private int length;

        public IntArray()
        {
            capacity = 5;
            length = 0;
            arr = new int[capacity];
        }

        //增
        public void Add(int value)
        {
            if(length < capacity)
            {
                arr[length] = value;
                ++length;
            }
            else
            {
                capacity += 5;
                int[] temp = new int[capacity];
                for(int i = 0; i < length; i++)
                {
                    temp[i] = arr[i];
                }
                arr = temp;
                arr[length] = value;
                ++length;
            }
        }
        //删
        // 1.根据值删除
        //优化：直接调用RemoveOnIndex()
        public void RemoveOnValue(int value)
        {
            //实例化一个整形数组类对象 用于处理有多个索引的情况
            IntArray index = new IntArray();
            int indexNum = 0;
            for(int i = 0; i <= length; i++)
            {
                if (arr[i] == value)
                {
                    index.arr[indexNum] = i;
                    indexNum++;
                }
            }
            if(indexNum == 0)
            {
                Console.WriteLine("未找到目标值");
            }
            else if(indexNum == 1)
            {
                //进行删除操作
                RemoveOnIndex(indexNum);
                --length;
                Console.WriteLine("目标值已删除");
            }
            else
            {
                Console.Write("找到{0}个目标值，要删除第几个呢：", indexNum);
                indexNum = int.Parse(Console.ReadLine());
                //进行删除操作
                RemoveOnIndex(indexNum);
                --length;
                Console.WriteLine("删除完成");
            }
        }
        // 2.根据索引删除
        public void RemoveOnIndex(int index)
        {
            if(index > length - 1 || index < 0)
            {
                Console.WriteLine("索引越界");
                return;
            }
            for(int i = index; i < length; i++)
            {
                arr[i] = arr[i + 1];
            }
            --length;
        }
        //查、改
        public int this[int index]
        {
            get
            {
                if(index > length)
                {
                    Console.WriteLine("输入的索引越界,对数组最后一位进行取值");
                    return arr[length - 1];
                }
                else if(index < 0)
                {
                    Console.WriteLine("输入的索引越界,对数组第一位进行取值");
                    return arr[0];
                }
                else
                {
                    return arr[index];
                }
            }
            set
            {
                if(index > arr.Length - 1)
                {
                    Console.WriteLine("索引越界，自动访问数组最后一位");
                    arr[length] = value;
                }
                else if(index < 0)
                {
                    Console.WriteLine("索引越界，自动访问数组第一位");
                    arr[0] = value;
                }
                else
                {
                    arr[index] = value;
                }
            }
        }
        
        //打印数组全部元素
        public void PrintArray()
        {
            for(int i = 0; i < arr.Length; i++)
            {
                Console.Write(arr[i] + " ");
            }
            Console.WriteLine();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            IntArray arr = new IntArray();
            arr.Add(6);
            arr.Add(6);
            arr.Add(6);
            arr.Add(6);
            arr.Add(7);
            arr.Add(8);
            arr.Add(8);
            arr.PrintArray();
            arr.RemoveOnIndex(3);
            arr.PrintArray();
            arr.RemoveOnIndex(3);
            arr.PrintArray();
            Console.WriteLine(arr[3]);
            arr[3] = 4;
            Console.WriteLine(arr[3]);
            Console.WriteLine(arr[7]);
            arr.Add(9);
            arr.PrintArray();
            Console.WriteLine(arr[7]);
            arr[5] = 44;
            Console.WriteLine(arr[5]);
            arr.PrintArray();
        }
    }
}